package com.wsg.dep.core;

import com.wsg.dep.exception.AlertException;
import com.wsg.dep.exception.TimeoutException;
import com.wsg.dep.seq.Sequence;

public interface WaitStrategy
{
    /**
     * 该方法用于等待指定的序列变得可用。
     * 由于不同的等待策略实现方式不同，该方法可能返回一个小于传入序列的值，通常用于表示超时情况。
     * 任何使用该等待策略来获取消息可用性通知的事件处理器都需要处理这种情况
     *
     * @param sequence          需要等待的序列编号.
     * @param cursor            环形缓冲区的主序列，等待 / 通知策略需要这个序列，因为它是唯一在更新时会被通知的序列。
     * @param dependentSequence 需要等待的依赖序列。
     * @param barrier           事件处理器正在等待的屏障。
     * @return 可用的序列编号，可能大于请求的序列编号。
     * @throws AlertException Disruptor 的状态发生了变化
     * @throws InterruptedException 线程在条件变量上需要被唤醒
     * @throws TimeoutException 等待指定序列时发生超时
     */
    long waitFor(long sequence, Sequence cursor, Sequence dependentSequence, SequenceBarrier barrier)
        throws AlertException, InterruptedException, TimeoutException;

    /**
     * 用于通知所有正在阻塞等待的 EventProcessor，表示游标已经前进，即有新的事件可用
     */
    void signalAllWhenBlocking();
}